package com.titan.core.base;

import java.util.Arrays;

import com.titan.core.utils.data.AssertUtils;

/**
 * @author 周成功
 * @email 86898837@qq.com
 * @date 2020年02月14日
 */
public abstract class BaseVariant implements java.io.Serializable, Cloneable {
    // 获得变量数量
    public abstract int size();

    // 获得变量名称列表
    public abstract String[] getVariants();
    
    // 获得变量值列表
    public abstract Object[] getValues();

    // 获得指定列的值，从1开始。
    public abstract Object getValue(int index);
    
    // 获得指定列的值，从v1开始。
    public Object getValue(String property) {
        String[] vars = getVariants();
        int index = 0;
        for (int i = 0; i < vars.length; i++) {
            if(vars[i].equalsIgnoreCase(property)) {
                index = i + 1;
            }
        }
        AssertUtils.assertTrue(index>0, "无效的属性["+property+"]！");
        return getValue(index);
    }
    
    // 设置指定列的值，从1开始。
    public abstract void setValue(int index, Object value);
    
    // 清理数据内容
    public abstract void clear();
    
    
    public Object clone() {
        Object o = null;
        try {
            o = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return o;
    }
    
    
    public boolean contains(Object value) {
        int len = size();
        if(value==null) {
            for (int i = 1; i <= len; i++) {
                Object obj = getValue(i);
                if(obj==null) {
                    return true;
                }
            }
        } else {
            for (int i = 1; i <= len; i++) {
                Object obj = getValue(i);
                if(value.equals(obj)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    
    @Override  
    public int hashCode() {  
        return Arrays.hashCode(this.getValues());
    }
    
    @Override  
    public boolean equals(Object obj) {
        if(this == obj) {
            return true;
        }
        if(obj == null) {
            return false;
        }
        if(getClass() != obj.getClass()) {
            return false;
        }
        final BaseVariant other = (BaseVariant)obj;
        int size = size();
        for (int i = 1; i <= size; i++) {
            Object o1 = this.getValue(i);
            Object o2 = other.getValue(i);
            if(java.util.Objects.equals(o1, o2)==false) {
                return false;
            }
        }
        return true;        
    }    
}
